<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>    
    <title>Estructuras comunes</title>    
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link href="../../styles.css" rel="stylesheet">
    <link rel="icon" href="../../images/icon.png">
	</head>
	<body>
		<div id="top">
      <h1>Estructuras comunes</h1> 
		</div>
    <div id="main">
      <h2>Contenido</h2>
      <div class="contents">
        <ol>        
          <li><a href="#intro">Introducci&oacute;n</a></li>
          <li><a href="#defs">Definiciones</a></li>
          <li><a href="#file-header">Encabezado de archivo</a></li>
          <li><a href="#section-header">Encabezado de secci&oacute;n</a></li>
          <li><a href="#name-table">Tabla de nombres</a></li>
          <li><a href="#padding">Relleno</a></li>
          <li><a href="#refs">Referencias</a></li>
        </ol>
      </div>
      <h2 id="intro">Introducci&oacute;n</h2>
      <div class="contents">
        <p>Los tipos de archivos en SMG son variados. A veces hay estructuras que se repiten entre los archivos por lo que esta p&aacute;gina va a exponer esas extructuras que me he conseguido.</p>
      </div>
      <h2 id="defs">Definiciones</h2>
      <div class="contents">
        <ul>
          <li><b>Archivo</b>: Conjunto de datos que tienen algun sentido.</li>
          <li><b>Secci&oacute;n</b>: Parte de un archivo que contiene datos que se relacionan entre s&iacute;.</li>
          <li><b>Encabezado</b>: Los datos que se escriben al comienzo de un archivo/secci&oacute;n.</li>
          <li><b>Relleno</b>: Una cadena de bytes que se usa para separar y alinear datos.</li>
          <li><b>Bit</b>: M&iacute;nima unidad posible para almacenar datos. Se puede almacenar un 0 o un 1.</li>
          <li><b>Byte</b>: M&iacute;nima unidad directamente accesible de almacenamiento de datos (8 bits de longitud).</li>
          <li><b>Entero</b>: Variable que almacena un n&uacute;mero entero (con signo/sin signo) de un n&uacute;mero de bits de logitud (en general de 8, 16 y 32 bits).</li>
        </ul>
      </div>
      <h2 id="file-header">Encabezado de archivo</h2>
      <div class="contents">
        <p>Los encabezados de archivos, en general, tienen un tama&ntilde;o de <b>32 bytes</b> y contienen los siguientes datos, en orden:</p>
        <br>
        <table>
          <tr>
            <th>Nombre</th>
            <th>Tama&ntilde;o</th>
            <th>Descripci&oacute;n</th>
          </tr>
          <tr>
            <td>Magia</td>
            <td>4 bytes</td>
            <td>Cadena de bytes que indica el tipo general de un archivo.</td>
          </tr>
          <tr>
            <td>Tipo</td>
            <td>4 bytes</td>
            <td>Cadena de bytes que indica el tipo espec&iacute;fico de un archivo.</td>
          </tr>
          <tr>
            <td>Tama&ntilde;o</td>
            <td>4 bytes</td>
            <td>Entero que contiene el tama&ntilde;o, en bytes, del archivo. Incluye el tama&ntilde;o del encabezado del archivo.</td>
          </tr>
          <tr>
            <td style="white-space: nowrap">N&uacute;mero de secciones</td>
            <td>4 bytes</td>
            <td>Entero que contiene el n&uacute;mero de secciones del archivo.</td>
          </tr>
          <tr>
            <td>Desconocido 1</td>
            <td style="white-space: nowrap">16 bytes</td>
            <td>Cadena de bytes cuyo prop&oacute;sito se desconoce. Est&aacute; mayormente lleno de <code>0xFF</code>.</td>
          </tr>
        </table>
        <br>
        <img src="../../images/common/file_header.png">
        <p class="idtext">Fig. 1: Encabezado de un archivo BDL visto en <code>ImHex</code>.</p>
      </div>
      <h2 id="section-header">Encabezado de secci&oacute;n</h2>
      <div class="contents">
        <p>Los encabezados de las secciones tienen un tama&ntilde;o de <b>8 bytes</b> y contienen los siguientes datos, en orden:</p>
        <br>
        <table>
          <tr>
            <th>Nombre</th>
            <th>Tama&ntilde;o</th>
            <th>Descripci&oacute;n</th>
          </tr>
          <tr>
            <td>Magia</td>
            <td>4 bytes</td>
            <td>Cadena de bytes que indica identifica el tipo de la secci&oacute;n.</td>
          </tr>
          <tr>
            <td>Tama&ntilde;o</td>
            <td>4 bytes</td>
            <td>Entero que contiene el tama&ntilde;o, en bytes, de la secci&oacute;n. Incluye el tama&ntilde;o del encabezado de la secci&oacute;n.</td>
          </tr>
        </table>
        <br>
        <img src="../../images/common/section_header.png">
        <p class="idtext">Fig. 2: Encabezado de una secci&oacute;n de un archivo BDL visto en <code>ImHex</code>.</p>
      </div>
      <h2 id="name-table">Tabla de nombres</h2>
      <div class="contents">
        <p>Las tablas de nombres son de tama&ntilde;o variable (depende de los nombres almacenados). Estas tablas almacenan varias cadenas de caracteres (codificadas en <a href="https://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT">Shift-JIS</a>) que pueden representar los nombres de huesos/texturas/materiales en un modelo 3D de SMG. Estas tablas contienen los siguientes datos, en orden:</p>
        <br>
        <table>
          <tr>
            <th>Nombre</th>
            <th>Tama&ntilde;o</th>
            <th>Descripci&oacute;n</th>
          </tr>
          <tr>
            <td style="white-space: nowrap">N&uacute;mero de nombres</td>
            <td>2 bytes</td>
            <td>Entero que contiene el n&uacute;mero de nombres en la tabla de nombres.</td>
          </tr>
          <tr>
            <td>Desconocido 1</td>
            <td>2 bytes</td>
            <td>Siempre <code>0xFFFF</code> &iquest;Puede ser la m&aacute;scara de los hashes que vienen despu&eacute;s?</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td><b>Inicio:</b> Informaci&oacute;n de los nombres</td>
            <td colspan="2">(4 * N&uacute;mero de nombres) bytes</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3">
              <table style="margin-left: 2%; width: 98%;">
                <tr>
                  <td>Hash[i]</td>
                  <td style="white-space: nowrap">2 bytes</td>
                  <td>Hash del i-&eacute;simo nombre truncado a 16 bits. <a href="#calc-hash">Rutina de c&aacute;lculo</a>.</td>
                </tr>
                <tr>
                  <td>&Iacute;ndice[i]</td>
                  <td>2 bytes</td>
                  <td>Posici&oacute;n del i-&eacute;simo nombre respecto al inicio de la tabla de nombres en bytes.</td>
                </tr>
              </table>
            </td>
          </tr>
          <tr>
            <td style="background-color: #EEEEEE;" colspan="3"><b>Final:</b> Informaci&oacute;n de los nombres</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td><b>Inicio:</b> Nombres</td>
            <td colspan="2">N&uacute;mero de bytes de todas las cadenas de caracteres</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3">
              <table style="margin-left: 2%; width: 98%;">
                <tr>
                  <td>Nombre[i]</td>
                  <td>Tama&ntilde;o en bytes de la cadena</td>
                  <td>Nombre en la posici&oacute;n i-&eacute;sima. Cadena de caracteres Shift-JIS que termina en el caracter nulo (<code>0x00</code>).</td>
                </tr>
              </table>
            </td>
          </tr>
          <tr>
            <td style="background-color: #EEEEEE;" colspan="3"><b>Final:</b> Informaci&oacute;n de los nombres</td>
          </tr>
        </table>
        <br>
        <img src="../../images/common/name_table.png">
        <p class="idtext">Fig. 3: Tabla de nombres de una secci&oacute;n de un archivo BTP vista en <code>ImHex</code>.</p>
        <br>
        <h3 id="calc-hash">Rutina de calculo del hash de la tabla de nombres</h3>
        <div class="code_block">
<pre>
HASH = [FIRST_BYTE_VALUE] * (3^(STRING_BYTE_LENGTH - 1)) 
       + [SECOND_BYTE_VALUE] * (3^(STRING_BYTE_LENGTH - 2))
       + [THIRD_BYTE_VALUE] * (3^(STRING_BYTE_LENGTH - 3))
       + ...
       + [LAST_BYTE_VALUE] * (3^(0))
</pre>
        </div>
        <p>Los valores de los bytes tienen que interpretarse como un entero con signo de 8 bits y la longitud de la cadena de caracteres no debe incluir el caracter nulo.</p>   
      </div>
      <h2 id="padding">Relleno</h2>
      <div class="contents">
        <p>Hay un relleno gen&eacute;rico que se encuentra en los archivos de SMG que se puede <i>leer</i>. Es una cadena de caracteres que se usa para alinear los pedazos de datos siguientes a una direcci&oacute;n en la posici&oacute;n del byte multiplo de <b>4 o 32</b> respecto al inicio de una secci&oacute;n o al inicio del archivo. El m&aacute;ximo tama&ntilde;o en el que se ha conseguido este relleno es de <b>31 bytes</b>:</p>
        <br>
        <p><code>This is padding data to alignme</code></p>
        <br>
        <img src="../../images/common/padding.png">
        <p class="idtext">Fig. 4: Rellenos de diferente tama&ntilde;o de un archivo BTP vistos en <code>ImHex</code>.</p>
        <br>
      </div>
      <h2 id="refs">Referencias</h2>
      <div class="contents">
        <ul>
          <li><a href="https://wiki.cloudmodding.com/zgcn/JSYSTEM">https://wiki.cloudmodding.com/zgcn/JSYSTEM</a></li>
        </ul>
      </div>
    </div>
	</body>
</html>
